# 项目实训
"""
1、下面程序的功能是：计算1-20任意数字的阶乘，请找出错误并修改验证
"""
# 错误代码
# result = 1
# num = int(input('请输入一个整数（1～20）：'))
# for i in range(2, num):
#     result *= i
# print(num, '的阶乘为：', result)

# 正确代码
result = 1
num = int(input('请输入一个整数（1～20）：'))
for i in range(2, num + 1):
    result *= i
print(num, '的阶乘为：', result)

"""
2、下面程序的功能是：输出1-50（包含50）的数，每行输出5个，请找出错误并修改验证
"""
# 错误代码
# k = 50
# while k = 50:
#     print(k, end=' ')
#     if k % 5 == 0:
#         print()

# 正确代码
k = 1
while k <= 50:
    print(k, end=' ')
    if k % 5 == 0:
        print()
    k += 1

    """
    下面程序的功能是：判断输入的年份是闰年还是平年(能被400整除或能被4整除且不能被100整除的年份是闰年，否则是平年)，请将正确答案写在横线处
    year = int(input('请输入年份：'))
    if _________________:
        print(year,'是闰年')
    else:
        print(year,'是平年')
    """
    year = int(input('请输入年份：'))
    if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
        print(year, '是闰年')
    else:
        print(year, '是平年')




"""
某商场元旦期间举行满减活动，规则如下：消费低于100元时没有减免，满100元减30元，满300元减100元，满500元减200元，请将正确答案写在横线处
x = int(input('请输入消费金额：'))
if x > 0:
    if x < 100:
        cost = x
    ____________
        cost = x - 30
    elif x < 500:
    _____________
    _____________
        cost = x - 200
    print('您的消费金额为：', x)
    print('应付金额为：', cost)
else:
    print('输入错误！')
"""
x = int(input('请输入消费金额：'))
if x > 0:
    if x < 100:
        cost = x
    elif x < 300:
        cost = x - 30
    elif x < 500:
        cost = x - 100
    else:
        cost = x - 200
    print('您的消费金额为：', x)
    print('应付金额为：', cost)
else:
    print('输入错误！')




"""
输出“水仙花数”，水仙花数是指1个3位的十进制数，其各个数字的立方和恰好等于该数本身，例如，153是水仙花数，因为153 = 1^3 + 5^3 +3^3
"""
count = 0  # 定义计数变量count，并赋值为0
for i in range(100, 1000):
    b = i // 100  # 计算百位数
    s = (i % 100) // 10  # 计算十位数
    g = i % 10  # 计算个位数
    # 判断数字的立方和是否等于该数本身
    if i == g ** 3 + s ** 3 + b ** 3:
        # 如果是，计数变量增加1，并输出该数
        count += 1
        print(i,end=' ')
print('\n水仙花数总共有', count, '个')



"""
百马百担，现有100匹马需驮运100担货，其中大马驮运3担，中马驮运2担，两匹小马驮一担，问一百匹马中大马、中马、小马各多少？编写程序将每种情况列出来
"""
n = 0 # 定义情况数
# i表示大马数，由于大马驮3担，所以它的取值小于100/3=33
for i in range(1,33):
    # j表示中马数，由于大马驮2担，所以它的取值小于100/2=50
    for j in range(1,50):
        k = 100 - j - i  # k表示小马数，计算小马数
        # 判断总担数量是否为100
        # 由于两匹小马驮一担，所以必须同时满足k为偶数
        if((i * 3 + j * 2 + k / 2) == 100 and (k % 2 == 0)):
            n += 1   # 情况数增加1
            # 输出每种马匹数
            # print('大马', i, '匹,中马', j, '匹,小马', k, '匹')
            print(f'大马{i}匹，中马{j}匹，小马{k}匹')
print(f'一共有{n}种情况') # 输出情况数



"""
国王的遗产:
X国是个小国，国王K有6个儿子，在临终前，K国王立下遗嘱：国王的一批牛作为遗产要分给它的6个儿子，其中，大儿子分1/4，二儿子分1/5，三儿子分1/6....直到小儿子分1/9，最后还剩下11头牛，分给管家，请计算国王这批遗产中一共有多少头牛，
todo:牛是活得，不能一头牛切开分
"""
x = 6 + 11  # 定义牛总数变量x，由于最后剩下11头牛且国王有6个儿子，故赋初值为17

while True:# 循环
    # 判断牛总数是否同时满足被4、5、6、7、8、9整除  判断最后剩下的牛头数是否等于11
    if (x % 4 == 0 and x % 5 == 0 and x % 6 == 0 and x % 7 == 0 and x % 8 == 0 and x % 9 == 0) and (x - x / 4 - x / 5 - x / 6 - x / 7 - x / 8 - x / 9 == 11):
        print('国王一共', x, '头牛')  # 如果是，输出x
        break  # 退出循环
    x += 1 # x增加1


    # 项目考核
    """
    1、下面关于python分支语句的描述中，错误的是（A）
    A.python分支结构使用if、elif和else来实现，每个if后面必须有elif或else
    B.if-else结构是可以嵌套的
    C.if语句会判断if后面的表达式，表达式为True时，执行if后的语句块
    D.缩进是python分支语句的语法部分，缩进不正确会影响分支功能

    2、下面关于python循环语句的描述中，错误的是（A）
    A.while循环语句只能实现无限循环
    B.所有的for语句只能实现无限循环
    C.break语句可以种植一个循环
    D.continue语句可以停止后续代码的执行，从循环开始重新执行

    3、下面程序的输出结果是（C）
    for i in range(1,6):
        if i % 4 == 0:
            continue
        else:
            print(i,end =',')
    A.1，2，3     B.1，2，3，4    C.1，2，3，5     D.1，2，3，5，6

    4、下面程序的循环次数是（D）
    k=0
    while k< 10
        if k < 1:
            continue
        if k == 5:
            break
        k += 1
    A.5     B.6    C.4     D.死循环，不能确定循环次数

    5、下面程序的输出结构是（A）
    for n in reange(1,5,5):
        print(n)
    A.1     B.2    C.5     D.4
    """

"""
1、下面程序的输出结果是24。
n = 1
s = 1
while n < 5
    s = s * n
    n = n + 1
print(s)
2、下面程序的输出结果是_20  10  10____。
x,y,z = 10,20,30
if x < y:
    z = x
    x = y
    y = z
print(x,y,z)
3、下面程序对输入的两个整数按从小到大的顺序输出，请在_____内填空。
a = int(input('请输入a的值：'))
b = int(input('请输入b的值：'))
if a > b:
    t = a
    a = b
    b = t
print(a,b)
4、下面程序的输出结果是15。
i,j,k = 1,3,5
while i != 0:
    if i % j == 0:
        if i % k == 0:
            print(i)
            break
    i = i + 1
"""



"""
设计简单的飞机行李托运计费系统，假设飞机上个人托运行李的条件是：行李重量在20千克以下免费托运；20-30千克超出部分5元/千克；30-40千克超出部分10元/千克；
40-50千克超出部分15元/千克；50千克以上不允许个人携带
"""
weight = float(input('请您输入行李的重量：'))
if weight < 0:
    print('您输入的数据有误！')
elif weight <= 20:
    print('您可以免费托运行李！')
elif weight <= 30:
    price = (weight - 20) * 5
    print('您的托运费用为', price, '元！')
elif weight <= 40:
    price = (30 - 20) * 5 + (weight - 30) * 10
    print('您的托运费用为', price, '元！')
elif weight <= 50:
    price = (30 - 20) * 5 + (40 - 30) * 10 + (weight - 40) * 15
    print('您的托运费用为', price, '元！')
else:
    print('您托运的行李超出了最高上限，不允许托运！')

"""
中国古代数学家张邱建在他的《算经》中提出了一个著名的“百钱买百鸡问题”：鸡翁一，值钱五，鸡母一，值钱三，鸡雏三，值钱一；百钱买百鸡，问翁、母、雏各几何？
编程输出所有可能的方案
"""
for cock in range(0, 20 + 1):  # 鸡翁范围在0到20之间
    for hen in range(0, 33 + 1):  # 鸡母范围在0到33之间
        for biddy in range(3, 99 + 1):  # 鸡雏范围在3到99之间
            # 如果钱数等于100
            if (5 * cock + 3 * hen + biddy / 3) == 100:
                # 如果购买的鸡数等于100
                if (cock + hen + biddy) == 100:
                    if biddy % 3 == 0:  # 判断鸡雏数是否能被3整除
                        print('鸡翁:', cock, '鸡母:', hen, '鸡雏:', biddy)


"""
使用while循环输出2-100的所有素数(只能被1和自己整除的自然数)
"""
i = 2
while i < 100:  # 循环范围为2～100
    j = 2
    while j < i:  # 循环范围为2～i
        if i % j == 0:  # 如果i能整除j，i不是素数
            break  # 跳出循环
        j = j + 1
    if j == i:  # 范围为2～i的循环结束后，如果j等于i，说明i为素数
        print(i, end=' ')  # 输出素数
    i = i + 1

"""
使用for循环输出一个正立实心等腰三角形
"""
for i in range(1, 10):				#循环范围为1～9
    for j in range(10 - i):			#循环范围为0～9-i
        print(end=' ')				#以空格结尾，不换行
    for k in range(10 - i, 10):	#循环范围为10-i～9
        print('*', end=' ')			#以空格结尾，不换行
    print('')							#换行